package org.joot.jmir2.display;

/**
 * 图形信息
 * <br>
 * 如帧数/fps等
 * <br>
 * 
 * @author ShawRyan
 *
 */
public final class Graphics {
	
	/* 单例 */
	private Graphics() { }
	private static Graphics single = new Graphics();
	public static Graphics get() {
		return single;
	}
	
	float deltaTime = 0;
	long frameStart = 0;
	int frames = 0;
	int maxFps = 60;
	int fps = maxFps;
	long lastTime = System.nanoTime();
	int tick = 0;
	int width;
	int height;
	boolean isNonpoweroftwoSupport;
	
	/**
	 * 获取当前游戏区域宽度
	 * 
	 * @return 宽度
	 */
	public int getWidth() {
		return width;
	}
	
	/**
	 * 获取当前游戏区域高度
	 * 
	 * @return 高度
	 */
	public int getHeight() {
		return height;
	}
	
	/**
	 * 获取当前游戏绘制每秒最大刷新次数
	 * <br>
	 * 实际刷新次数应该小于此数值
	 * <br>
	 * 通过{@link #getFramesPerSecond() fps}获取前一秒实际fps或{@link #getCurrentFrame() currentFps}获取当前是这一秒中第几次绘制界面
	 * 
	 * @return 最大帧数
	 */
	public int getMaxFps() {
		return maxFps;
	}
	
	/**
	 * 获取两帧间隔
	 * 
	 * @return 当前帧与前一帧之间的间隔(单位为毫秒)
	 */
	public float getDeltaTime () {
		return deltaTime;
	}
	/**
	 * 获取渲染帧数
	 * 
	 * @return 前一秒总共渲染帧数
	 */
	public int getFramesPerSecond () {
		return fps;
	}
	/**
	 * 获取当前帧数
	 * 
	 * @return 当前为这一秒第几帧
	 */
	public int getCurrentFrame() {
		return frames;
	}
	/**
	 * 获取当前是{@link #getMaxFps() maxFps}内第几帧
	 * <br>
	 * 此参数不是当前(渲染)秒内的帧数，而是在一次渲染循环中的第几帧
	 * <br>
	 * 每发生一次有效渲染，此数值加1
	 * <br>
	 * 此数值最大为{@link #getMaxFps() maxFps}，最小为1
	 * <br>
	 * 此参数作为精灵帧控制参数
	 * 
	 * @return 获取当前为渲染循环中第几次有效渲染
	 */
	public int getTick() {
		return tick;
	}
	
	/**
	 * 是否支持非2次幂宽高纹理
	 * <br>
	 * 对于不支持非2幂次宽高纹理的显卡，我们在处理纹理时会填充颜色信息到纹理中将纹理补充为2幂次宽高
	 * <br>
	 * 我们会将纹理的有颜色区域移至新纹理的右下角，在绘制时再将其绘制顶点向左上角偏移{@link org.joot.jmir2.texture.loader.TextureLoadingTask#call() load}
	 * 
	 * @return 程序(目标物理机显卡)是否支持渲染非2次幂宽高纹理图片
	 */
	public boolean isNonpoweroftwoSupport() {
		return isNonpoweroftwoSupport;
	}
	
	void updateTime () {
		long time = System.nanoTime();
		deltaTime = (time - lastTime) / 1000000000.0f;
		lastTime = time;
		if(tick > maxFps) tick = 0;
		tick++;

		if (time - frameStart >= 1000000000) {
			fps = frames;
			frames = 0;
			frameStart = time;
		}
		frames++;
	}
}